package com.macro.mall.portal.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.PageHelper;
import com.macro.mall.mapper.*;
import com.macro.mall.model.*;
import com.macro.mall.portal.dao.PortalProductDao;
import com.macro.mall.portal.domain.PmsPortalProductDetail;
import com.macro.mall.portal.domain.PmsProductCategoryNode;
import com.macro.mall.portal.service.PmsPortalProductService;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/** 前台订单管理Service实现类 Created by macro on 2020/4/6. */
@Service
public class PmsPortalProductServiceImpl implements PmsPortalProductService {
  @Autowired private PmsProductMapper productMapper;
  @Autowired private PmsProductCategoryMapper productCategoryMapper;
  @Autowired private PmsBrandMapper brandMapper;
  @Autowired private PmsProductAttributeMapper productAttributeMapper;
  @Autowired private PmsProductAttributeValueMapper productAttributeValueMapper;
  @Autowired private PmsSkuStockMapper skuStockMapper;
  @Autowired private PmsProductLadderMapper productLadderMapper;
  @Autowired private PmsProductFullReductionMapper productFullReductionMapper;
  @Autowired private PortalProductDao portalProductDao;

  @Override
  public List<PmsProduct> search(
      String keyword,
      Long brandId,
      Long productCategoryId,
      Integer pageNum,
      Integer pageSize,
      Integer sort) {
    PageHelper.startPage(pageNum, pageSize);
    PmsProductExample example = new PmsProductExample();
    PmsProductExample.Criteria criteria = example.createCriteria();
    criteria.andDeleteStatusEqualTo(0);
    criteria.andPublishStatusEqualTo(1);
    if (StrUtil.isNotEmpty(keyword)) {
      criteria.andNameLike("%" + keyword + "%");
    }
    if (brandId != null) {
      criteria.andBrandIdEqualTo(brandId);
    }
    if (productCategoryId != null) {
      criteria.andProductCategoryIdEqualTo(productCategoryId);
    }
    // 1->按新品；2->按销量；3->价格从低到高；4->价格从高到低
    if (sort == 1) {
      example.setOrderByClause("id desc");
    } else if (sort == 2) {
      example.setOrderByClause("sale desc");
    } else if (sort == 3) {
      example.setOrderByClause("price asc");
    } else if (sort == 4) {
      example.setOrderByClause("price desc");
    }
    return productMapper.selectByExample(example);
  }

  @Override
  public List<PmsProductCategoryNode> categoryTreeList() {
    PmsProductCategoryExample example = new PmsProductCategoryExample();
    List<PmsProductCategory> allList = productCategoryMapper.selectByExample(example);
    List<PmsProductCategoryNode> result =
        allList.stream()
            .filter(item -> item.getParentId().equals(0L))
            .map(item -> covert(item, allList))
            .collect(Collectors.toList());
    return result;
  }

  @Override
  public PmsPortalProductDetail detail(Long id) {
    PmsPortalProductDetail result = new PmsPortalProductDetail();
    // 获取商品信息
    PmsProduct product = productMapper.selectByPrimaryKey(id);
    result.setProduct(product);
    // 获取品牌信息
    PmsBrand brand = brandMapper.selectByPrimaryKey(product.getBrandId());
    result.setBrand(brand);
    // 获取商品属性信息
    PmsProductAttributeExample attributeExample = new PmsProductAttributeExample();
    attributeExample
        .createCriteria()
        .andProductAttributeCategoryIdEqualTo(product.getProductAttributeCategoryId());
    List<PmsProductAttribute> productAttributeList =
        productAttributeMapper.selectByExample(attributeExample);
    result.setProductAttributeList(productAttributeList);
    // 获取商品属性值信息
    if (CollUtil.isNotEmpty(productAttributeList)) {
      List<Long> attributeIds =
          productAttributeList.stream()
              .map(PmsProductAttribute::getId)
              .collect(Collectors.toList());
      PmsProductAttributeValueExample attributeValueExample = new PmsProductAttributeValueExample();
      attributeValueExample
          .createCriteria()
          .andProductIdEqualTo(product.getId())
          .andProductAttributeIdIn(attributeIds);
      List<PmsProductAttributeValue> productAttributeValueList =
          productAttributeValueMapper.selectByExample(attributeValueExample);
      result.setProductAttributeValueList(productAttributeValueList);
    }
    // 获取商品SKU库存信息
    PmsSkuStockExample skuExample = new PmsSkuStockExample();
    skuExample.createCriteria().andProductIdEqualTo(product.getId());
    List<PmsSkuStock> skuStockList = skuStockMapper.selectByExample(skuExample);
    result.setSkuStockList(skuStockList);
    // 商品阶梯价格设置
    if (product.getPromotionType() == 3) {
      PmsProductLadderExample ladderExample = new PmsProductLadderExample();
      ladderExample.createCriteria().andProductIdEqualTo(product.getId());
      List<PmsProductLadder> productLadderList = productLadderMapper.selectByExample(ladderExample);
      result.setProductLadderList(productLadderList);
    }
    // 商品满减价格设置
    if (product.getPromotionType() == 4) {
      PmsProductFullReductionExample fullReductionExample = new PmsProductFullReductionExample();
      fullReductionExample.createCriteria().andProductIdEqualTo(product.getId());
      List<PmsProductFullReduction> productFullReductionList =
          productFullReductionMapper.selectByExample(fullReductionExample);
      result.setProductFullReductionList(productFullReductionList);
    }
    // 商品可用优惠券
    result.setCouponList(
        portalProductDao.getAvailableCouponList(product.getId(), product.getProductCategoryId()));
    return result;
  }

  /** 初始对象转化为节点对象 */
  private PmsProductCategoryNode covert(PmsProductCategory item, List<PmsProductCategory> allList) {
    PmsProductCategoryNode node = new PmsProductCategoryNode();
    BeanUtils.copyProperties(item, node);
    List<PmsProductCategoryNode> children =
        allList.stream()
            .filter(subItem -> subItem.getParentId().equals(item.getId()))
            .map(subItem -> covert(subItem, allList))
            .collect(Collectors.toList());
    node.setChildren(children);
    return node;
  }
}
